#include "RealMulti.h"

/*
	RealMulti
*/

/*	public	*/

const RealMulti RealMulti::PI("3.141592653589793238462643383279");

RealMulti::RealMulti()
	: _value(0.0, REAL_MULTI_PRECISION), _isNaN(false) {}

RealMulti::RealMulti(const string& s)
	: _value(s, REAL_MULTI_PRECISION), _isNaN(false) {}

RealMulti::RealMulti(const RealMulti& r)
	: _value(r._value, REAL_MULTI_PRECISION), _isNaN(false) {}

RealMulti::RealMulti(const mpf_class& f)
	: _value(f, REAL_MULTI_PRECISION), _isNaN(false) {}

RealMulti::RealMulti(double d)
	: _value(d, REAL_MULTI_PRECISION), _isNaN(false) {}

RealMulti::RealMulti(long l)
	: _value(l, REAL_MULTI_PRECISION), _isNaN(false) {}

RealMulti::RealMulti(int i)
	: _value(i, REAL_MULTI_PRECISION), _isNaN(false) {}


RealMulti::operator double() const {
	return _value.get_d();
}

const RealMulti& RealMulti::operator=(double d) {
	_value = d;
	_isNaN = false;
	return *this;
}

const RealMulti& RealMulti::operator=(const RealMulti& r) {
	_value = r._value;
	_isNaN = false;
	return *this;
}


RealMulti RealMulti::operator+() const {
	return RealMulti(*this);
}

RealMulti RealMulti::operator-() const {
	return RealMulti(- _value);
}


RealMulti RealMulti::operator+(const RealMulti& r) const {
	RealMulti rm(*this);
	rm._value += r._value;
	return rm;
}

RealMulti RealMulti::operator-(const RealMulti& r) const {
	RealMulti rm(*this);
	rm._value -= r._value;
	return rm;
}

RealMulti RealMulti::operator*(const RealMulti& r) const {
	RealMulti rm(*this);
	rm._value *= r._value;
	return rm;
}

RealMulti RealMulti::operator/(const RealMulti& r) const {
	RealMulti rm(*this);
	rm._value /= r._value;
	return rm;
}


const RealMulti& RealMulti::operator+=(const RealMulti& r) {
	_value += r._value;
	return *this;
}

const RealMulti& RealMulti::operator-=(const RealMulti& r) {
	_value -= r._value;
	return *this;
}

const RealMulti& RealMulti::operator*=(const RealMulti& r) {
	_value *= r._value;
	return *this;
}

const RealMulti& RealMulti::operator/=(const RealMulti& r) {
	_value /= r._value;
	return *this;
}


bool RealMulti::operator>(const RealMulti& r) const {
	return _value > r._value;
}

bool RealMulti::operator<(const RealMulti& r) const {
	return _value < r._value;
}

bool RealMulti::operator==(const RealMulti& r) const {
//	if (_isNaN || r._isNaN) {
//		return false;
//	}
	return _value == r._value;
}

bool RealMulti::operator!=(const RealMulti& r) const {
	return _value != r._value;
}

void RealMulti::setToNaN(bool flag) {
	_isNaN = flag;
}

bool RealMulti::isNaN() const {
	return _isNaN;
}

RealMulti RealMulti::abs() const {
	return RealMulti(::abs(_value));
}

ostream& operator<<(ostream& os, const RealMulti& r) {
	os << r._value;
	return os;
}


